//
// Description: transform方法使用
//              将某个容器中的所有元素都进行某种同样的操作（如：加1）
//              将某个容器中的所有元素与另一个容器中的所有对应元素进行某种操作（如：相加）
// Created by Loading on 2021/3/7.
//

#include <bits/stdc++.h>

using namespace std;

//加2
int op_increase2(int a) {
    return a + 2;
}

//转换为大写
char op_upper(char c) {
    if (islower(c)) {//判断是否为小写
        return c - 32;
    }
    return c;
}

//两数相乘
int op_multi(int a, int b) {
    return a * b;
}

int main() {
    vector<int> v1 = {1, 2, 3, 4, 5};
    vector<char> v2 = {'a', 'B', 'c'};
    //重载版本1
    //参数：源容器起始地址，源容器结束地址，目标容器起始地址，操作方法（一元）
    //如果目标容器元素个数小于源容器元素个数，则超出部分将丢失
    transform(v1.begin(), v1.end(), v1.begin(), op_increase2);
    transform(v2.begin(), v2.end(), v2.begin(), op_upper);
    for (auto &x : v1) {
        cout << x << " ";
    }
    cout << endl;
    for (auto &c : v2) {
        cout << c << " ";
    }
    cout << endl;

    vector<int> v3 = {2, 3, 4, 5, 6};
    vector<int> v4 = {3, 4, 5, 6, 7};
    vector<int> sum(v3.size());
    //重载版本2
    //参数：源容器1起始地址，源容器1结束地址，源容器2起始地址，目标容器起始地址，操作方法（二元）
    //重载版本2必须要保证两个容器的元素个数相等，否则会抛出异常。
    transform(v3.begin(), v3.end(), v4.begin(), sum.begin(), op_multi);
    for (auto &x : sum) {
        cout << x << " ";
    }
}